package com.qf.base.result;

import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.base.result
 * @Description: 封装统一的响应报文  这个类是通用的返回结果 这个类支持链式编程
 * @Date 2022/7/28 19:37
 */
public class R {

    /**
     * 响应码
     */
    private int code;

    /**
     * 响应摘要信息
     */
    private String msg;

    /**
     * 响应携带的数据
     */
    private Object result;

    /**
     * 成功的默认值
     */
    private static final int OK = 200;

    /**
     * 成功的默认提示
     */
    private static final String OK_MSG = "请求成功";

    /**
     * 失败的默认值
     */
    private static final int ERROR=500;

    /**
     * 失败的默认提示
     */
    public static final String ERROR_MSG="请求失败";

    public boolean isOk(){
        if (this.code/OK == 1){
            return true;
        }
        return false;
    }

    /**
     * @return
     */

    public R setCode(int code) {
        this.code = code;
        return this;
    }

    public R setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    public R setResult(Object result) {
        this.result = result;
        return this;
    }

    public R setResult(String key,Object value) {
        if (result == null){
            //如果result没有数据, 就实例一个json
            JSONObject result = new JSONObject();
            result.put(key,value);
            this.result = result;
        } else {
            if (result instanceof JSONObject){
                ((JSONObject) result).put(key, value);
            }
            if (result instanceof Map){
                ((Map) result).put(key,value);
            }
        }
        return this;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getResult() {
        return result;
    }

    /**
     * 请求成功的方法
     */
    public static R ok(){
        return new R().setCode(OK).setMsg(OK_MSG).setResult(null);
    }
    public static R ok(int code){
        return ok().setCode(code);
    }
    public static R ok(String msg){
        return ok().setMsg(msg);
    }
    public static R ok(int code,String msg){
        return ok().setCode(code).setMsg(msg);
    }
    public static R ok(Object data){
        return ok().setResult(data);
    }

    /**
     * 请求失败的方法
     */
    public static R error(){
        return new R().setCode(ERROR).setMsg(ERROR_MSG).setResult(null);
    }

    public static R error(int code){
        return error().setCode(code);
    }
    public static R error(String msg){
        return error().setMsg(msg);
    }
    public static R error(int code,String msg){
        return error().setCode(code).setMsg(msg);
    }
    public static R error(Object data){
        return error().setResult(data);
    }

    public String toJsonString(R r){
        return JSONObject.toJSONString(r);
    }
    @Override
    public String toString() {
        return toJsonString(this);
    }
}
